﻿using System;
using System.Linq;
using Imladris.BUS.DocumentRepoUOW;
using Imladris.BUS.DocumentCodeListRepo;
using Imladris.Common.Interfaces;
using Imladris.Entities;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Imladris.Test.ServerSide
{
    [TestClass]
    public class DocumentRepoTest
    {
        [TestMethod]
        public void ChangedEmployeeIdTest()
        {
            
            //arrange
            var documentID = 6;
            var employeeID = 5;
            var doc = GetChangedDocumetByIdSetEmployee(employeeID, documentID);
            Assert.IsNotNull(doc, "doc is NULL");
            Assert.AreEqual(documentID, doc.DocumentID);
            Assert.AreEqual(employeeID, doc.EmpoyeeID);

            //act
            employeeID = 9;
            using (var uow = new UnitOfWork())
            {
                using (var repo = new DocumentsRepo(uow))
                {
                    var document = repo.AllIncluding(c => c.DocumentRights,
                        d => d.DocumentChanges,
                        j => j.DocumentPersons).FirstOrDefault(d => d.DocumentID == documentID);

                    using (var codeListRepo = new DocumentsCodeListRepo())
                    {
                        var employee = codeListRepo.EployeesCL.FirstOrDefault(f => f.ID == employeeID);
                        document.EmpoyeeID = employee.ID;
                    }

                    document.State = State.Modified;

                    repo.InsertOrUpdate(document);
                    uow.Save();
                }
            }

            Document docChanged;
            using (var repo = new DocumentsRepo(new UnitOfWork()))
            {
                docChanged = repo.AllIncluding(c => c.DocumentRights,
                    d => d.DocumentChanges,
                    j => j.DocumentPersons).FirstOrDefault(d => d.DocumentID == documentID);


            }

            //assert
            Assert.IsNotNull(docChanged, "docChanged is NULL");
            Assert.AreEqual(employeeID, docChanged.EmpoyeeID);
            Assert.AreEqual(documentID, docChanged.DocumentID);
             
        }
        /*
        [TestMethod]
        public void NewDocument_InsertNewWithoutFile()
        {
            
            //arange
            var doc = PrepareNewDocument();
            int? documentID = null;
            //act 
            using (var uow = new UnitOfWork())
            {
                using (var repo = new DocumentsWebRepo(uow))
                {
                    repo.InsertOrUpdateGraph(doc);
                    uow.Save();
                    documentID = doc.DokumentID;
                }
            }
            Assert.IsNotNull(documentID);

            Dokument newDocAfterSave;
            using (var repo = new DocumentsWebRepo(new UnitOfWork()))
            {
                newDocAfterSave = repo.AllIncluding(c => c.DokumentPravice,
                    d => d.DokumentSpremembe,
                    j => j.OsebaDokumenti).FirstOrDefault(d => d.DokumentID == documentID);


            }

            //assert
            Assert.IsNotNull(newDocAfterSave, "newDocAfterSave is NULL");
            Assert.AreEqual(documentID.Value, newDocAfterSave.DokumentID);
            
        }
       */
        #region Helper methods

        //private Dokument PrepareNewDocument()
        //{
        //    Dokument doc;

        //    doc = new Dokument();
        //    FillForNewDocument(doc);
        //    var docPerson = GetNewDocPerson(doc);
        //    //var docVersion = GetNewDocVersion(doc);  //uporabi po shranjevanju
        //    var docRightSelf = GenerateNewRightForDokumentPravica(doc, "Žnidar Marko", true, true, true, true, true);
        //    var docRightAll = GenerateNewRightForDokumentPravica(doc, "Vsi", true, true, true, false, true);
        //    var docChange = GetNewDocChange(doc);

        //    //set states and add
        //    doc.State = State.Added;
        //    docPerson.State = State.Added;
        //    docRightAll.State = State.Added;
        //    docRightSelf.State = State.Added;
        //    docChange.State = State.Added;

        //    doc.OsebaDokumenti.Add(docPerson);
        //    doc.DokumentPravice.Add(docRightSelf);
        //    doc.DokumentPravice.Add(docRightAll);
        //    doc.DokumentSpremembe.Add(docChange);

        //    return doc;
        //}

        //private DokumentSprememba GetNewDocChange(Dokument doc)
        //{
        //    var change = new DokumentSprememba();
        //    //drv("DokumentID") = aDr("DokumentID")
        //    change.DokumentID = doc.DokumentID;
        //    //drv("DatumNastanek") = aDr("DatumNastanek")
        //    change.DatumNastanek = doc.DatumNastanek;
        //    //drv("DatumPrispelo") = aDr("DatumPrispelo")
        //    change.DatumPrispelo = doc.DatumPrispelo;
        //    //drv("DatumPoslano") = aDr("DatumPoslano")
        //    change.DatumPoslano = doc.DatumPoslano;
        //    //drv("ZaposleniID") = aDr("ZaposleniID")
        //    change.ZaposleniID = doc.ZaposleniID;
        //    //drv("ZapisNovKdoID") = Insight.ZaposleniID
        //    change.ZapisNovKdoID = doc.ZaposleniID;
        //    //drv("ZapisNovKdaj") = Now
        //    change.ZapisNovKdaj = DateTime.Now;

        //    return change;
        //}


        //private static DokumentPravica GenerateNewRightForDokumentPravica(Dokument doc, string azManGroupName, bool read, bool write, bool isDefault, bool delete, bool fullControl)
        //{
        //    var right = new DokumentPravica();
        //    right.DokumentID = doc.DokumentID;
        //    right.Skupina = azManGroupName;
        //    right.BranjeYN = read;
        //    right.PisanjeYN = write;
        //    right.IzPrivzetoYN = isDefault;
        //    right.BrisanjeYN = delete;
        //    right.PolniNadzorYN = fullControl;
        //    return right;
        //}

        //private OsebaDokument GetNewDocPerson(Dokument doc)
        //{
        //    var docPerson = new OsebaDokument();
        //    docPerson.DokumentID = doc.DokumentID;
        //    docPerson.NosilecYN = true;
        //    docPerson.OsebaID = 3;
        //    docPerson.ZapisPopravljenKdoID = doc.ZaposleniID;
        //    docPerson.ZapisPopravljenKdaj = DateTime.Now;

        //    return docPerson;
        //}

        //private DokumentRazlicica GetNewDocVersion(Dokument doc)
        //{
        //    /*
        //     *   If Not aDr("Datoteka") Is DBNull.Value Then
        //    'dvignemo različico če je pripeta datoteka
        //    If aDr("Razlicica") Is DBNull.Value Then
        //        aDr("Razlicica") = 1
        //    Else
        //        aDr("Razlicica") = aDr("Razlicica") + 1
        //    End If

        //    'Dodamo zapis v tabelo DokumentRazlicica
        //    Dim drv As DataRowView
        //    drv = _ds.Tables("DokumentRazlicica").DefaultView.AddNew()
        //    drv.BeginEdit()
        //    drv("DokumentID") = aDr("DokumentID")

        //    drv("Opis") = aDr("DatotekaPot")
        //    drv("Razlicica") = aDr("Razlicica")
        //    drv("DatotekaTip") = aDr("DatotekaTip")
        //    drv("DatotekaFilter") = aDr("DatotekaFilter")
        //    drv("ZapisNovKdoID") = Insight.ZaposleniID
        //    drv("ZapisNovKdaj") = DateTime.Now
        //    drv.EndEdit()
        //End If
        //     * */
        //    DokumentRazlicica docVersion = null;

        //    if (doc.DatotekaYN.HasValue && (bool)doc.DatotekaYN)
        //    {
        //        if (doc.Razlicica.HasValue)
        //        {
        //            doc.Razlicica += 1;
        //        }
        //        else
        //        {
        //            doc.Razlicica = 1;
        //        }

        //        docVersion = new DokumentRazlicica();
        //        docVersion.DokumentID = doc.DokumentID;
        //        docVersion.Opis = doc.DatotekaPot;
        //        docVersion.Razlicica = doc.Razlicica;
        //        docVersion.DatotekaTip = doc.DatotekaTip;
        //        docVersion.DatotekaFilter = doc.DatotekaFilter;
        //        docVersion.ZapisNovKdoID = doc.ZaposleniID;
        //        docVersion.ZapisNovKdaj = DateTime.Now;
        //    }

        //    return docVersion;
        //}

        //private static void FillForNewDocument(Dokument doc)
        //{

        //    //     'Obvezni podatki
        //    //If aDR("Opis") Is DBNull.Value Then
        //    //    Throw New RequiredDataException("Opis je obvezen podatek!")
        //    //End If
        //    doc.Opis = "Web testni dokument 1";

        //    //If aDR("Proj_ID") Is DBNull.Value Then
        //    //    Throw New RequiredDataException("Projekt je obvezen podatek!")
        //    //End If
        //    doc.PROJ_ID = -1;
        //    //If aDR("DokumentKategorijaID") Is DBNull.Value Then
        //    //    Throw New RequiredDataException("Kategorija je obvezen podatek!")
        //    //End If
        //    doc.DokumentKategorijaID = 3;

        //    //If aDR("IzvorID") Is DBNull.Value Then
        //    //    Throw New RequiredDataException("Izvor je obvezen podatek!")
        //    //End If
        //    doc.IzvorID = 1;

        //    //If aDR("DokumentVrstaID") Is DBNull.Value Then
        //    //    Throw New RequiredDataException("Vrsta je obvezen podatek!")
        //    //End If
        //    doc.DokumentVrstaID = 16;

        //    //If aDR("OriginalID") Is DBNull.Value Then
        //    //    Throw New RequiredDataException("Original je obvezen podatek!")
        //    //End If
        //    doc.OriginalID = 3;

        //    //If aDR("DatumNastanek") Is DBNull.Value Then
        //    //    Throw New RequiredDataException("Datum nastanka je obvezen podatek!")
        //    //End If
        //    doc.DatumNastanek = DateTime.Now;

        //    //If aDR("ZaposleniID") Is DBNull.Value Then
        //    //    Throw New RequiredDataException("Zaposleni je obvezen podatek!")
        //    //End If
        //    doc.ZaposleniID = 5232;

        //    //If aDR("StanjeID") Is DBNull.Value Then
        //    //    Throw New RequiredDataException("Stanje je obvezen podatek!")
        //    //End If
        //    doc.StanjeID = 0;

        //    doc.Razlicica = 1;

        //    // dr("ZapisPopravljenKdoID") = Insight.ZaposleniID
        //    doc.ZapisPopravljenKdoID = doc.ZaposleniID;

        //    //dr("ZapisPopravljenKdaj") = DateTime.Now
        //    doc.ZapisPopravljenKdaj = DateTime.Now;

        //    // dr("ZapisNovKdoID") = Insight.ZaposleniID
        //    doc.ZapisNovKdoID = doc.ZaposleniID;

        //    //dr("ZapisNovKdaj") = DateTime.Now
        //    doc.ZapisNovKdaj = DateTime.Now;

        //    doc.BrisanjeYN = false;
        //    doc.IzbrisanYN = false;
        //    doc.DatotekaYN = false;
        //    doc.SpletObjava = false;
        //    doc.YN1 = false;
        //    doc.YN2 = false;
        //    doc.YN3 = false;
        //    doc.YN4 = false;
        //    doc.PlacanoYN = false;
        //}


        private static void SetZaposleniIdOnDokument(int zaposleniId, int dokumentId)
        {
            var dokument = ChangeDocumentByIdSetEmployee(zaposleniId, dokumentId);
        }

        private static Document GetChangedDocumetByIdSetEmployee(int employeeID, int documentID)
        {
            return ChangeDocumentByIdSetEmployee(employeeID, documentID);
        }

        private static Document ChangeDocumentByIdSetEmployee(int employeeID, int documentID)
        {
            Document document;
            using (var uow = new UnitOfWork())
            {
                using (var documentsRepo = new DocumentsRepo(uow))
                {
                    document = documentsRepo.AllIncluding(c => c.DocumentRights,
                        d => d.DocumentChanges,
                        j => j.DocumentPersons).FirstOrDefault(d => d.DocumentID == documentID);

                    using (var codeListRepo = new DocumentsCodeListRepo())
                    {
                        var employee = codeListRepo.EployeesCL.FirstOrDefault(f => f.ID == employeeID);
                        document.EmpoyeeID = employee.ID;
                    }

                    document.State = State.Modified;

                    documentsRepo.InsertOrUpdate(document);
                    uow.Save();
                }
            }
            return document;
        }
        #endregion
    }
}
